#ifndef JDATAFILE_H
#define JDATAFILE_H

#include <iostream>
#include <unistd.h>
#include <fstream>
#include <string>
#include <deque>
#include <vector>

#define MAXPATH 256

/*************************************
* @projectName   JDPasswdNote
* @brief         密码本数据结构
* @author        LJJ
* @date          2019-1-19
*************************************/
typedef struct JDPasswdNote {
    std::string CreateTime;     // 创建时间
    std::string ModifiedTime;   // 修改时间
    std::string Name;           // 账号产品名称
    std::string Type;           // 类型
    std::string Account;        // 账号名
    std::string Email;          // 邮箱
    std::string Phone;          // 电话
    std::string Pwd;            // 密码
    std::string Pwd2;           // 二级密码
    std::string Remark;         // 备注
}JDPWD;

/*************************************
* @projectName   JDBookData
* @brief         书籍数据结构
* @author        LJJ
* @date          2019-1-28
*************************************/
typedef struct JDBookData {
    std::string BookName;       // 书名
    std::string BookType;       // 书籍类型
    std::string BookAuthor;     // 作者
    std::string AuthorHome;     // 作者国籍
    std::string BookPunlish;    // 出版社
    std::string DataTime;       // 看书时间
    std::string BookStatus;     // 看书状态
    std::string TimeLen;        // 阅读时长
    std::string BookSummary;    // 书籍梗概
    std::string BookPlat;       // 看书平台
    std::string Remark;         // 备注
}JDBOOK;

class JDataFile
{
private:
    // 数据队列
    std::deque<std::string> DataList;

public:
    JDataFile();

    /*************************************
    * @projectName   GetCurrentPath
    * @brief         获取程序目录
    * @Param         参数
    * @return        程序目录字符串
    * @author        LJJ
    * @date          2019-1-17
    *************************************/
    std::string GetCurrentPath();

    /*************************************
    * @projectName   GetAllLines
    * @brief         获取文件数据列表
    * @Param         FileName:文件名, DataList:数据列表
    * @return        返回值
    * @author        LJJ
    * @date          2019-1-17
    *************************************/
    int GetAllLines(const std::string FileName, std::deque<std::string> &DataList);

    /*************************************
    * @projectName   GetData
    * @brief         返回数据列表
    * @Param         数据
    * @return        数据个数
    * @author        LJJ
    * @date          2019-1-20
    *************************************/
    int GetData(std::deque<std::string> &DataList);

    /*************************************
    * @projectName   AddLineData
    * @brief         添加一行数据
    * @Param         FileName:文件名, Data:添加数据
    * @return        成功返回true, 失败返回false
    * @author        LJJ
    * @date          2019-1-17
    *************************************/
    bool AddLineData(const std::string FileName, const std::string Data);

    /*************************************
    * @projectName   ModifiedLineData
    * @brief         修改一行的数据
    * @Param         FileName:文件名, Index:队列中修改数据的序号, Data:修改数据
    * @return        成功返回true, 失败返回false
    * @author        LJJ
    * @date          2019-1-20
    *************************************/
    bool ModifiedLineData(const std::string FileName, const std::string Data);
    bool ModifiedLineData(const std::string FileName, const unsigned int Index, const std::string Data);

    /*************************************
    * @projectName   DeleteLineData
    * @brief         删除一行数据
    * @Param         FileName:文件名, Index:队列中删除数据的序号, Data:删除数据
    * @return        成功返回true, 失败返回false
    * @author        LJJ
    * @date          2019-1-19
    *************************************/
    bool DeleteLineData(const std::string FileName, std::string Data);
    bool DeleteLineData(const std::string FileName, const unsigned int Index);

    /*************************************
    * @projectName   DeleteTypeData
    * @brief         删除数据文件中某种类型的数据
    * @Param         FileName: 文件名, Type: 数据类型
    * @return        成功返回true, 失败返回false
    * @author        LJJ
    * @date          2019-1-25
    *************************************/
    bool DeleteTypeData(const std::string FileName, std::string Type);

    /*************************************
    * @projectName   DeleteDataFile
    * @brief         删除数据文件
    * @Param         FileName: 文件名
    * @return        成功返回true, 失败返回false
    * @author        LJJ
    * @date          2019-1-25
    *************************************/
    bool DeleteDataFile(const std::string FileName);

    /*************************************
    * @projectName   SaveAllData
    * @brief         保存数据
    * @Param         FileName:文件名, List:数据
    * @return        返回值
    * @author        LJJ
    * @date          2019-1-21
    *************************************/
    bool SaveAllData(const std::string FileName, const std::deque<std::string> List);

    /*************************************
    * @projectName   PwdtoString
    * @brief         将数据结构中数据转换成一行数据
    * @Param         Data:一行密码本数据
    * @return        返回数据字符串
    * @author        LJJ
    * @date          2019-1-19
    *************************************/
    std::string PwdtoString(JDPasswdNote Data);

    /*************************************
    * @projectName   StringtoPwd
    * @brief         将字符串数据转成数据结构
    * @Param         Data: 数据结构
    * @return        数据结构
    * @author        LJJ
    * @date          2019-1-19
    *************************************/
    JDPasswdNote StringtoPwd(std::string Data);

    /*************************************
    * @projectName   BooktoString
    * @brief         将数据结构中数据转换成一行数据
    * @Param         Data:一行密码本数据
    * @return        返回数据字符串
    * @author        LJJ
    * @date          2019-1-28
    *************************************/
    std::string BooktoString(JDBookData Data);

    /*************************************
    * @projectName   StringtoPwd
    * @brief         将字符串数据转成数据结构
    * @Param         Data: 数据结构
    * @return        数据结构
    * @author        LJJ
    * @date          2019-1-28
    *************************************/
    JDBookData StringtoBook(std::string Data);

    /*************************************
    * @projectName   EncryptionString
    * @brief         加密字符串
    * @Param         Data: 需要加密的字符串
    * @return        加密完成的字符串
    * @author        LJJ
    * @date          2019-1-19
    *************************************/
    std::string EncryptionString(std::string Data);

    /*************************************
    * @projectName   解密字符串
    * @brief         摘要
    * @Param         Data: 需要解密的字符串
    * @return        解密完成的字符串
    * @author        LJJ
    * @date          2019-1-19
    *************************************/
    std::string DecodeString(std::string Data);

private:
    std::string CurrentPath;
};

#endif // JDATAFILE_H
